package cn.achao.csr.chat.service;

import cn.achao.csr.api.model.req.ChatMessagePageReq;
import cn.achao.csr.api.model.req.ChatMessageReq;
import cn.achao.csr.api.model.entity.ChatMsg;
import cn.achao.csr.api.model.resp.ChatMessageResp;
import cn.achao.csr.base.resp.CursorPageBaseResp;
import cn.achao.csr.base.resp.WSBaseResp;

import javax.websocket.Session;

/**
 * @Author: achao
 **/
public interface ChatService {

    /**
     * 用户连接聊天服务器初始化
     * @param session
     * @param userId
     */
    void onOpen(Session session, Long userId);

    /**
     * 用户断开聊天服务器
     * @param userId
     */
    void onClose(Long userId);

    /**
     * 收到客户端信息
     * @param message
     * @param userId
     */
    void onMessage(String message, Long userId);

    /**
     * 发送消息
     *
     * @param message
     * @param userId
     * @return
     */
    Long sendMsg(ChatMessageReq message, Long userId);

    /**
     * 根据消息获取消息前端展示的物料
     *
     * @param message
     * @param receiveUid 接受消息的uid，可null
     * @return
     */
    ChatMessageResp getMsgResp(ChatMsg message, Long receiveUid);

    /**
     * 根据消息获取消息前端展示的物料
     *
     * @param msgId
     * @param receiveUid 接受消息的uid，可null
     * @return
     */
    ChatMessageResp getMsgResp(Long msgId, Long receiveUid);

    /**
     * 发消息给某个用户
     * @param wsBaseMsg
     * @param uid
     */
    void sendToUid(WSBaseResp<?> wsBaseMsg, Long uid);

    /**
     * 推动消息给所有在线的人
     *
     * @param wsBaseResp 发送的消息体
     * @param skipUid    需要跳过的人
     */
    void sendToAllOnline(WSBaseResp<?> wsBaseResp, Long skipUid);

    /**
     * 获取消息列表
     *
     * @param req
     * @return
     */
    CursorPageBaseResp<ChatMessageResp> getMsgPage(ChatMessagePageReq req, Long userId);
}
